#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <unistd.h>
#include <aio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

// ./cp1 file1 file2
int main(int argc, const char *argv[]){
        if(argc != 3) return -1;

        struct stat st; // 收集文件相关信息(大小、类型)
        int ret = stat(argv[1], &st);
        if(ret == 0){
            printf("%s file type is %s, size is %ld\n",
                            argv[1],
                            S_ISREG(st.st_mode)?"文件":"目录",
                            st.st_size);
            if(S_ISDIR(st.st_mode)) {
                printf("%s 是一个目录，目前功能不支持的!\n", argv[1]);
                return -1;
            }
        }
        char *buf = (char *)malloc(st.st_size); 
        bzero(buf, st.st_size);
    	
       // aio读的cb
        struct aiocb cb1 = {
            .aio_fildes = open(argv[1], O_RDONLY|O_EXCL),
            .aio_buf = buf,
            .aio_nbytes = st.st_size,
            .aio_offset = 0,
            .aio_reqprio = 1
        };
       
        // aio写的cb
        struct aiocb cb2 = {
            .aio_fildes = open(argv[2], O_WRONLY|O_CREAT, 0755),
            .aio_buf = buf,
            .aio_nbytes = st.st_size,
            .aio_reqprio = 1
        };
    
        // 发起请求（读、写）
        aio_read(&cb1);
        aio_write(&cb2);
        while(aio_error(&cb1) == EINPROGRESS);
        while(aio_error(&cb2) == EINPROGRESS);
        
        printf("OK\n");
        close(cb1.aio_fildes);
        close(cb2.aio_fildes);
        free(buf); // 释放缓冲空间

        return 0;
}
